晓晓的个人博客Logo
晓晓的个人博客
有关Service Worker的一些小事(本文持续更新)
AI提炼icon
提炼
本文围绕 Chrome Extension 中 Service Worker 展开,强调其对 Chrome Extension 应用的重要性,并记录关于它的一些关键细节点。指出每个 Chrome Extension 仅有一个 Service Worker,manifest 文件里设置的 js 文件在 Service Worker 每次启动及休眠后重启时执行,执行该文件若需设置持久性数据,要做好唯一性校验。还表明 Service Worker 休眠后,内存变量(全局变量)、特定监听函数及动态请求头设置规则会被清除,开发者应适时采用持久性缓存方案。同时说明多个插件的 Service Worker 环境相互隔离,一个插件内 Content 与 Service Worker 是 N - 1 关系,Content 触发 Service Worker 操作要做好唯一性校验,且建立长链接通信能唤醒休眠的 Service Worker,最佳实践是监听断联时机并重建长链接,以确保插件随时可用。最后表示内容基于实践测试,期待指正并会持续更新
本文于 2025-06-03 16:22 首次发布,最后修改于 2025-08-27 13:11

写在开篇

Service Worker 是 Chrome Extension 的大脑,只有对 Service Worker 足够了解,才能更好的应用 Chrome Extension。

本文,将持续记录“关于 Service Worker 的一些小细节”。

一个插件的 Service Worker 本身

1. 每个 Chrome Extension 拥有一个 Service Worker;

2. 可以在 Service Worker 中向 IndexDB 中存储数据,但是无法在后台界面中看到,只能用代码存取;

3. 在 manifest.json 文件中设置的 JS 文件会在 Service Worker 每次启动、休眠后重启时 都会执行一次;

这是一个十分重要的细节点如果有一些在执行这个文件时需要设置的持久性数据的,请务必做好唯一性校验工作;

4. 经过实践测试,Service Worker 休眠后的这些内容会被清除(重要!重要!!重中之重!!!):

内存变量[全局变量];

监听函数:

chrome.webRequest.onBeforeSendHeaders.addListener 设置的监听函数;

动态请求头设置规则:

chrome.declarativeNetRequest.updateDynamicRules 设置的变动规则;

chrome.declarativeNetRequest.updateSessionRules 设置的请求规则;【2025.6.4更新,该规则数据在浏览器关闭、更新时清除】

为什么特别指明“全局变量”?是因为开发者手册中可以找到原文引用,且用户需要注意在适当时候使用持久性缓存方案:

Any global variables you set will be lost if the service worker shuts down. Instead of using global variables, save values to storage.

chrome.declarativeNetRequest.updateSessionRules 设置的请求头更新规则在用户手册中找到原文:

Session rules are cleared when the browser shuts down and when a new version of the extension is installed.

多个插件的 Service Worker 之间

1. 每个 Chrome Extension 拥有一个 Service Worker,但多个 Chrome Extension 的 Service Worker 环境是相互隔离的;

一个插件的 Content 层与 Service Worker

1. Content 与 Service Worker 是 N-1 的关系;

即,针对一个插件来说,当我们打开多个 TAB(Content层)时,多个 Content 层都在与同一个 Service Worker 交互。

这里就要注意:当由 Content 触发 Service Worker 层的执行与数据设置时,务必做好唯一性校验;

2. Content 与 Service Worker 建立长链接通信通道时,会唤醒休眠的 Service Worker;

这里有个 最佳实践(交互) :监听长链接通信通道的断联时机,在断联时,重新创建长链接通信通道,就可以实现:用户不刷新 TAB 页面的情况下,唤醒 Service Worker,从而达到“随时可以使用插件”的目的。

写在最后

Service Worker 与 插件的其他部件 有关的通信资料 请参阅《Chrome Extension通信相关(汇总)》、《关于Chrome Extension option的一些小事》。

本节内容皆为实践测试所得,如有不够严谨的地方,请指正,另外,本文会在后续实践中持续更新,敬请关注~

0个赞
喜欢就点个赞吧